AvgPoolingGrad

根据输入梯度对平均池化前的特征图计算反向传播梯度。

\[output_{b, x_h, x_w, c} += \frac{input_{b, y_h, y_w, c}}{\text{window}_h \cdot \text{window}_w}\]

其中 \((y_h, y_w)\)\((x_h, x_w)\) 之间满足窗口与步长的映射关系。

输入:
  • input - 反向传播输入梯度张量首地址。

  • output - 反向传播输出梯度张量首地址。

  • batch - 批大小。

  • output_h - 池化输出高度。

  • output_w - 池化输出宽度。

  • channel - 通道数。

  • input_w - 池化输入宽度。

  • input_h - 池化输入高度。

  • stride_w - 水平步长。

  • stride_h - 垂直步长。

  • pad_l - 左侧填充大小。

  • pad_u - 上侧填充大小。

  • window_w - 池化窗口宽度。

  • window_h - 池化窗口高度。

  • core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。

输出:
  • output - 原地累加平均池化反向传播梯度。

支持平台:

FT78NE MT7004

备注

  • FT78NE 支持 fp32 数据类型。

  • MT7004 支持 fp16、fp32 数据类型。

共享存储版本:

void hp_avgpoolinggrad_s(const half *input, half *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int core_mask)
void fp_avgpoolinggrad_s(const float *input, float *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int core_mask)

C调用示例:

 1// FT78NE 多核示例
 2#include <stdio.h>
 3
 4int main(void) {
 5    const float *input = (const float *)0xA0000000;  // DDR 存储
 6    float *output = (float *)0xB0000000;
 7    int batch = 16;
 8    int output_h = 7;
 9    int output_w = 7;
10    int channel = 64;
11    int input_w = 14;
12    int input_h = 14;
13    int stride_w = 2;
14    int stride_h = 2;
15    int pad_l = 0;
16    int pad_u = 0;
17    int window_w = 2;
18    int window_h = 2;
19    int core_mask = 0xff;
20    fp_avgpoolinggrad_s(input, output, batch, output_h, output_w,
21                         channel, input_w, input_h,
22                         stride_w, stride_h,
23                         pad_l, pad_u,
24                         window_w, window_h,
25                         core_mask);
26    return 0;
27}

私有存储版本:

void hp_avgpoolinggrad_p(const half *input, half *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int start_idx, int end_idx)
void fp_avgpoolinggrad_p(const float *input, float *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int start_idx, int end_idx)

C调用示例:

 1// MT7004 单核示例
 2#include <stdio.h>
 3
 4int main(void) {
 5    const half *input = (const half *)0x10000000;    // L2 存储
 6    half *output = (half *)0x10004000;
 7    int batch = 4;
 8    int output_h = 4;
 9    int output_w = 4;
10    int channel = 128;
11    int input_w = 8;
12    int input_h = 8;
13    int stride_w = 2;
14    int stride_h = 2;
15    int pad_l = 0;
16    int pad_u = 0;
17    int window_w = 2;
18    int window_h = 2;
19    int start_idx = 0;
20    int end_idx = batch * output_h * output_w * channel;
21    hp_avgpoolinggrad_p(input, output, batch, output_h, output_w,
22                        channel, input_w, input_h,
23                        stride_w, stride_h,
24                        pad_l, pad_u,
25                        window_w, window_h,
26                        start_idx, end_idx);
27    return 0;
28}